@Query অ্যানোটেশন
Spring Data JPA-তে @Query অ্যানোটেশন ব্যবহার করে কাস্টম SQL বা JPQL (Java Persistence Query Language) কোয়েরি লেখা যায়। এটি ডাটাবেস অপারেশনকে আরও কাস্টমাইজ করার সুযোগ দেয় এবং ডিফল্ট মেথডের বাইরে বিশেষ কন্ডিশনে ডেটা রিট্রিভ বা ম্যানিপুলেট করার জন্য ব্যবহার হয়।
@Query এর ব্যবহার
@Query অ্যানোটেশন সরাসরি একটি Repository ইন্টারফেসের মেথডের ওপরে ব্যবহার করা হয়।
সাধারণ উদাহরণ:
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
@Query("SELECT e FROM Employee e WHERE e.department = :department")
List<Employee> findByDepartment(@Param("department") String department);
}
বিবরণ:
@Queryএর মধ্যে JPQL (Hibernate-সমর্থিত SQL) কোয়েরি ব্যবহার করা হয়েছে।@Paramব্যবহার করে প্যারামিটার ম্যাপিং করা হয়েছে।
@NamedQuery অ্যানোটেশন
@NamedQuery হলো Hibernate এবং JPA-তে পূর্বনির্ধারিত কাস্টম কোয়েরি। এটি Entity ক্লাসে ডিফাইন করা হয় এবং Spring Data JPA এর মাধ্যমে ডাকা হয়। @NamedQuery-এর প্রধান সুবিধা হলো কোয়েরি একবার কম্পাইল হওয়ার পর একাধিকবার পুনর্ব্যবহারযোগ্য হওয়া।
@NamedQuery এর ব্যবহার
Entity ক্লাসে @NamedQuery ডিফাইন করা:
import jakarta.persistence.*;
@Entity
@NamedQuery(name = "Employee.findByDepartment", query = "SELECT e FROM Employee e WHERE e.department = :department")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String department;
// Getters and Setters
}
Repository ইন্টারফেসে @NamedQuery ব্যবহার:
import org.springframework.stereotype.Repository;
@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
List<Employee> findByDepartment(@Param("department") String department);
}
@Query এবং @NamedQuery এর মধ্যে পার্থক্য
| বৈশিষ্ট্য | @Query | @NamedQuery |
|---|---|---|
| ডিফাইন করার স্থান | Repository ইন্টারফেসে ডিফাইন করা হয়। | Entity ক্লাসে ডিফাইন করা হয়। |
| কোডের স্থানীয়তা | নির্দিষ্ট মেথডের জন্য সীমাবদ্ধ। | পুনর্ব্যবহারযোগ্য, বিভিন্ন মেথডে ব্যবহার করা যায়। |
| কোড সংরক্ষণ | কোয়েরি প্রতি মেথডে আলাদা সংরক্ষণ। | একবার সংরক্ষণ করে বারবার ব্যবহার। |
| সহজতা | নতুন মেথড যোগ করা সহজ। | নতুন মেথড যোগ করার আগে Entity আপডেট করতে হয়। |
উদাহরণ: @Query এবং @NamedQuery একত্রে ব্যবহার
@Query ব্যবহার:
@Query("SELECT e FROM Employee e WHERE e.salary > :salary")
List<Employee> findEmployeesWithSalaryGreaterThan(@Param("salary") Double salary);
@NamedQuery ব্যবহার:
@Entity
@NamedQuery(name = "Employee.findEmployeesWithSalaryGreaterThan", query = "SELECT e FROM Employee e WHERE e.salary > :salary")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private Double salary;
// Getters and Setters
}
Repository মেথড:
List<Employee> findEmployeesWithSalaryGreaterThan(@Param("salary") Double salary);
সারাংশ
- @Query অ্যানোটেশন দ্রুত কাস্টম কোয়েরি লেখার জন্য Repository লেয়ারে ব্যবহার করা হয়।
- @NamedQuery আগে থেকেই ডিফাইন করা কাস্টম কোয়েরি পুনর্ব্যবহার করার জন্য Entity ক্লাসে ব্যবহার করা হয়।
- এই দুই অ্যানোটেশন ডেটাবেস অপারেশনকে আরও ফ্লেক্সিবল এবং কার্যকর করে তোলে।